#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
@Filename      :re_work.py
@Description   :正则表达式的补充
@Datetime      :2020/09/14 11:23:45
@Author        :AshJo
@Version       :v1.0
"""

import re

# a开头至少一个字母组成的字符串
re_match = r'^a[A-Za-z]*'
test_str = 'append|fddsfsdfsdfabcsdfdsf|sdapple'
result = re.findall(re_match, test_str)
# print(result)

# 以1开头，中间3-5位数字，x结尾，中间的值不能超过5位
re_match = '^1[0-9]{3,5}x$'
test_str = '12563x'
result = re.findall(re_match, test_str)
# print(result)

# split 根据正则表达式分割
result = re.split('[0-9]+', 'alex222cc')
# print(result)

# sub 替换
result = re.sub('[0-9]+', 'H', 'alex222cc666')
# print(result)

# subn 替换并返回替换次数到一个元组，可以设置替换的次数
result = re.subn('[0-9]+', 'H', 'alex222cc666aaa777', 2)
# print(result)

# match 强制只从开头匹配，用于精准匹配，跟re.serach()类似
result = re.match('[0-9]+', '123abc')
# print(result.group())

# compile 需要多次使用解析同一个正则表达式时可以使用，提高代码的时间效率
ret = re.compile('[0-9]+')
res1 = ret.findall('alex222cc666aaa777')
res2 = ret.search('alex222cc666aaa777')
# print(res1)
# print(res2)

# finditer 以迭代器的数据格式返回，节省代码运行时占用的空间
ret_f = re.finditer('[0-9]+', 'alex23165oo|46dd54fdfaa')
# print(ret_f)
# for i in ret_f:
#     print(i.group())

# 先compile后finditer,节省时间和空间
# （注意：如果代码没有重复调用正则，并不能从真正意义上提高效率）
ret1 = re.compile('[0-9]+')
res = ret1.finditer('alex23165oo|46dd54fd|f213aa')
# for r in res:
#     print(r.group())

# 标签匹配
exp = '<h1>lkjdafj2313 34</h1><h2> sdfsdfsdd354321</h2>'
# ret = re.findall('<\w+>(.*?)</\w+>', exp)
# print(ret)

# 用户输入身份证号匹配
ident_num = '440103199707311234'
# re.match('[0-9]\d{14}(\d{2}[\dx])?$', ident_num)
# re.match('([0-9]\d{16}[\dx]|[0-9]\d{14})$', ident_num)

# 分组命名,取消分组优先
# (?P<组命>正则)  (?P=组命) (?:正则)
# 分组命令匹配相同的html标签
# ret = '<(?P<tag>\w+)>.*?</(?P=tag)>'  ret.group('tag')

# 内置函数filter()+lambda 匿名函数 实现过滤列表中的空字符串元素
l1 = ['', '', 'a', 1, '2', '', '3', 'b']
l1 = list(filter(lambda n: n, l1))
# print(l1)

# 匹配年月日日期 格式：2018-12-6, 2018.05.07
date_str = '2018.05.17'
r = r'[0-9]\d{3}(?P<sub>[^\d])(1[0-r2]|0?[1-9])(?P=sub)(3[0-1]|[12]\d|0?[1-9])'
# print(re.match(r, date_str))


# 匹配邮箱地址
mail_str = '1048019331@qq.com'
re_mail = r'[-\w.]+@([-\dA-Za-z]+\.)+[A-Za-z\d]{2,6}'
# print(re.match(re_mail, mail_str))


# 标签的类似匹配
exp_tag = '''
<a>wahaha</a>
<b>banana</b>
<h1>qqxing</h1>
'''
# ret1 = re.findall('<\w+>(.*?)</\w+>', exp_tag)
# print(ret1)

# ret2 = re.findall('<(\w+)>.*?</\w+>', exp_tag)
# print(ret2)

# 计算器
exp_cal = '1-2*((60-30 +(-40/5)(9-25/3+7/399/42998+10568/14))-(-43)/(16-3*2))'
# 1) 从上面的算式中匹配出最内层小括号以及小括号内的表达式
result = re.findall(r'\([^()]+\)', exp_cal)
print(result)

# print(eval(exp))

# 先匹配小括号里的内容
# 然后先计算乘除法
# 在计算加减法

# 用循环用正则
# 调用函数


# 从类似9-25/3+7/399/42998+10568/14的表达式中匹配从左到右的第一个乘法或除法
exp_cal = '9-25/3+7/399/42998+10568/14'
res = re.search(r'\d+[*/]\d+', exp_cal)
print(res.group(0))


